package cn.iocoder.boot.domain.strategy.repository;
import cn.iocoder.boot.domain.strategy.model.entity.StrategyAwardEntity;
import cn.iocoder.boot.domain.strategy.model.entity.StrategyEntity ;
import cn.iocoder.boot.domain.strategy.model.entity.StrategyRuleEntity;
import cn.iocoder.boot.domain.strategy.model.valobj.RuleTreeVO;
import cn.iocoder.boot.domain.strategy.model.valobj.StrategyAwardRuleModelVO;
import cn.iocoder.boot.domain.strategy.model.valobj.StrategyAwardStockKeyVO;

import java.util.List;
import java.util.Map;

/**
 * @author Huangjun
 * @description 策略仓储接口，用于操作策略相关的数据
 * @create 2025/10/26
 */
public interface IStrategyRepository {

    /**
     * 根据策略ID查询策略奖品列表
     * @param strategyId 策略ID
     * @return 策略奖品列表
     */
    List<StrategyAwardEntity> queryStrategyAwardList(Long strategyId);
    /**
     * 存储策略奖品查找概率表到Redis缓存中
     * @param key 缓存键，用于唯一标识策略奖品搜索率表
     * @param rateRange 搜索率范围，用于计算搜索率键
     * @param strategyAwardSearchRateTable 策略奖品搜索率表，键为搜索率键，值为奖品ID
     */
    void storeStrategyAwardSearchRateTable(String key, Integer rateRange, Map<Integer, Integer> strategyAwardSearchRateTable);
    /**
     * 根据键和概率键获取策略奖品装配信息
     * @param key 缓存键，用于唯一标识策略奖品查找概率表
     * @param rateKey 搜索率键，用于计算奖品ID
     * @return 奖品ID
     */
    Integer getStrategyAwardAssemble(String key, Integer rateKey);

    /**
     * 获取策略的概率范围值
     * @param strategyId 策略ID
     * @return 搜索率范围
     */
    int getRateRange(Long strategyId);

    /**
     * 获取策略的概率范围值
     * @param key 缓存键，用于唯一标识策略奖品查找概率表
     * @return 搜索率范围
     */
    int getRateRange(String key);
    /**
     * 根据策略ID查询策略实体
     * @param strategyId 策略ID
     * @return 策略实体
     */
    StrategyEntity queryStrategyEntityByStrategyId(Long strategyId);
    /**
     * 查询策略规则
     * @param strategyId 策略ID
     * @param ruleModel 规则模型
     * @return 策略规则实体
     */
    StrategyRuleEntity queryStrategyRule(Long strategyId, String ruleModel);
    /**
     * 查询策略规则值
     * @param strategyId 策略ID
     * @param awardId 奖品ID
     * @param ruleModel 规则模型
     * @return 策略规则值
     */
    String queryStrategyRuleValue(Long strategyId, Integer awardId, String ruleModel);
    /**
     * 查询策略奖品规则模型值对象
     * @param strategyId 策略ID
     * @param awardId 奖品ID
     * @return 策略奖品规则模型值对象
     */
    StrategyAwardRuleModelVO queryStrategyAwardRuleModelVO(Long strategyId, Integer awardId);
    /**
     * 查询策略规则值
     * @param strategyId 策略ID
     * @param ruleModel 规则模型
     * @return 策略规则值
     */
    String queryStrategyRuleValue(Long strategyId, String ruleModel);

    RuleTreeVO queryRuleTreeVOByTreeId(String treeId);

     /**
     * 缓存奖品库存
     * @param cacheKey 缓存键，用于唯一标识策略奖品缓存库存
     * @return 策略奖品缓存库存
     */
    void cacheStrategyAwardCount(String cacheKey, Integer awardCount);

    Boolean subtractionAwardStock(String cacheKey);

    void awardStockConsumeSendQueue(StrategyAwardStockKeyVO build);

    StrategyAwardStockKeyVO takeQueueValue();

    void updateStrategyAwardStock(Long strategyId, Integer awardId);

    StrategyAwardEntity queryStrategyAwardEntity(Long strategyId, Integer awardId);
}
